package controlador;

import classes.Ausencia;
import classes.AusenciaTipo;
import classes.Gozo;
import classes.Lotacao;
import classes.Servidor;
import dao.AusenciaDao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.GeralException;
import fachada.Fachada;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author roberta.m.carvalho
 */
public class AusenciaControlador {

    private AusenciaDao dao;

    public AusenciaControlador() {

        this.dao = new AusenciaDao();
    }

    public void inserirTipoAusecia(AusenciaTipo at) throws ConexaoException, ConsultaException, GeralException {
        if (at.getNome().trim().equals("")) {
            throw new GeralException("Preencha todos os campos obrigatórios.");
        } else {
            this.dao.inserirAusenciaTipo(at);
        }

    }

    public void inserirAusecia(Ausencia a) throws ConexaoException, ConsultaException, GeralException {

        this.dao.inserirAusencia(a);

    }

    public ArrayList<AusenciaTipo> listarTipo() throws ConexaoException, ConsultaException {
        return (ArrayList<AusenciaTipo>) this.dao.listarTipo();
    }

    public void deletar(AusenciaTipo at) throws ConexaoException, ConsultaException {
        this.dao.deletar(at);
    }

    public void deletarAusencia(Ausencia at, Gozo gozo) throws ConexaoException, ConsultaException {
        this.dao.deletarAusencia(at, gozo);
    }

    public void deletarGozo(Gozo gozo) throws ConexaoException, ConsultaException {
        this.dao.deletarGozo(gozo);
    }

    public ArrayList<Ausencia> listar() throws ConexaoException, ConsultaException {
        return (ArrayList<Ausencia>) this.dao.listar();
    }

    public ArrayList<Ausencia> listarPeriodos(Servidor serv) throws ConexaoException, ConsultaException {
        return (ArrayList<Ausencia>) this.dao.listarPeriodos(serv);
    }

    public Ausencia PesquisarPeriodo(Gozo gozo) throws ConexaoException, ConsultaException {
        return (Ausencia) this.dao.PesquisarPeriodo(gozo);
    }

    public ArrayList<Gozo> listarGozo(Lotacao lot) throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozo(lot);
    }

    public ArrayList<Gozo> listarGozo() throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozo();
    }

    public ArrayList<Gozo> listarGozoAberto() throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozoAberto();
    }

    public ArrayList<Gozo> listarGozoEncerrado(Lotacao l) throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozoEncerrado(l);
    }

    public ArrayList<Gozo> listarGozoAberto(Lotacao l) throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozoAberto(l);
    }

    public ArrayList<Gozo> listarGozoEncerrados() throws ConexaoException, ConsultaException {
        return (ArrayList<Gozo>) this.dao.listarGozoEncerrados();
    }

    public void inserirGozo(Gozo gozo, Ausencia ausencia) throws ConexaoException, ConsultaException, GeralException {
        Fachada f = new Fachada();
        //Ausencia a = new Ausencia();
        //a = f.pesquisarAusencia(ausencia);
        long dias, saldo;
        Date dataInicial, dataAquisFinal;
        dias = gozo.getDias();

        dataInicial = gozo.getDataInicial();
        dataAquisFinal = ausencia.getAquisitivoFinal();

        if (dataAquisFinal.getTime() > dataInicial.getTime()) {
            throw new GeralException("Não é possível iniciar gozo antes do fim do período aquisitivo.");
        }
        if (gozo.getDias() == 0 || gozo.getDias() < 0) {
            throw new GeralException("Quantidade de dias incorreta.");
        } else {
            this.dao.inserirGozo(gozo, ausencia);
        }

    }

    public void alterarSaldo(Ausencia ausencia) throws ConexaoException, ConsultaException, GeralException {
        this.dao.alterarSaldo(ausencia);
    }

    public void alterarTipo(AusenciaTipo ausenciaTipo) throws ConexaoException, ConsultaException, GeralException {
        this.dao.alterarTipoGozo(ausenciaTipo);
    }

    public void alterarAusencia(Ausencia ausencia) throws ConexaoException, ConsultaException, GeralException {
        this.dao.alterarAusencia(ausencia);
    }

    public void alterarGozo(Gozo gozo) throws ConexaoException, ConsultaException, GeralException {
        this.dao.alterarGozo(gozo);
    }

    public Ausencia pesquisarAusencia(Ausencia a) throws ConexaoException, ConsultaException {
        return (Ausencia) this.dao.pesquisarAusencia(a);
    }

    public Gozo pesquisarGozo(Gozo gozo) throws ConexaoException, ConsultaException {
        return (Gozo) this.dao.pesquisarGozo(gozo);
    }

    public void alterarAberto(Gozo gozo) throws ConexaoException, ConsultaException {
        this.dao.alterarAberto(gozo);
    }
}
